#ifndef PLUGINMANAGER_H
#define PLUGINMANAGER_H

#include <QMap>
#include <QObject>

#include "PluginMetaData.h"

class QPluginLoader;
class PluginInterface;
class PluginMessage;
class PluginManager : public QObject {
  Q_OBJECT
public:
  explicit PluginManager(QObject * = nullptr);
  ~PluginManager();

  // 加载插件
  void loadPlugins();

  // 插件个数
  int count() const;

  // 插件元数据
  QList<PluginMetaData> getPluginMetaData() const;

  // 获取指定插件的MetaData
  PluginMetaData getPluginMetaData(const QString &iid) const;

  // 获取指定插件的widget
  QWidget *getPluginWidget(const QString &iid) const;

  // 查找插件
  PluginInterface *findPluginByName(const QString &name);

  // 插件是否加载
  bool isLoad(const QString &iid) const;

private:
  QMap<QString, QPluginLoader *> pluginLoaders;
  QMap<QString, QObject *> pluginObjects;
  QMap<QString, PluginInterface *> pluginInterfaces;

  void initPluginSearchPath();

  Q_SLOT void receiveMessage(const PluginMessage &);
};

#endif // PLUGINMANAGER_H
